﻿/*
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Common;
using System.Reflection;

namespace IvyOrm
{
    /// <summary>
    /// Exposes the protected method GetParameterPlaceholder to the DbCommandBuilder as an extension.
    /// </summary>
    public static class GetParameterPlaceholderExtension 
    {
        static MethodInfo getParameterPlaceholderMethod;
        /// <summary>
        ///  Returns the placeholder for the parameter in the associated SQL statement.
        /// </summary>
        /// <param name="commandBuilder">The builder that provides the format of the placeholder</param>
        /// <param name="parameterOrdinal">The number to be included as part of the parameter's name.</param>
        /// <returns>The name of the parameter with the specified number appended.</returns>
        public static string GetParameterPlaceholder(this DbCommandBuilder commandBuilder, int parameterOrdinal)
        {
            if (commandBuilder == null)
                throw new ArgumentNullException("commandBuilder");

            if (getParameterPlaceholderMethod == null)
                getParameterPlaceholderMethod = typeof(DbCommandBuilder).GetMethod("GetParameterPlaceholder", BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic, null, new Type[] { typeof(int) }, null);

            return (string)getParameterPlaceholderMethod.Invoke(commandBuilder, new object[] { parameterOrdinal });
        }
    }
}
